package com.ugoodtech.mdcc.core.service.impl;

import com.ugoodtech.mdcc.core.Constants;
import com.ugoodtech.mdcc.core.domain.ComplaintReport;
import com.ugoodtech.mdcc.core.dto.ComplaintTimeResponse;
import com.ugoodtech.mdcc.core.service.ComplaintTimeService;
import org.springframework.stereotype.Service;

import java.text.DecimalFormat;
import java.util.Date;

/**
 * <p>计算投诉报告时间</p>
 *
 * @author Blank Gong
 * @version 1.0 2019/4/28
 */
@Service
public class ComplaintTimeServiceImpl implements ComplaintTimeService {

    /**
     * 计算投诉报告用时时间
     *
     * @param complaintReport 投诉报告
     * @return 投诉报告时间返回类
     */
    @Override
    public ComplaintTimeResponse getComplaintTime(ComplaintReport complaintReport) {
        //计算出小时的值
        double hourTime = 1000 * 60 * 60;
        //时间返回类
        ComplaintTimeResponse timeResponse = new ComplaintTimeResponse();

        //需要返回的时间
        //总用时
        double totalTime;
        //处理实际用时
        double actualProcessingTime;
        //剩余时间
        double remainingTime;

        //能获取到的时间和条件
        //当前时间
        Long nowTime = System.currentTimeMillis();
        //第一次审核时间
        Long firstAuditTime = complaintReport.getFirstAuditTime().getTime();
        //最近一次审核时间
        Long auditTime = complaintReport.getAuditTime().getTime();
        //有效时间
        double validTime = complaintReport.getValidTime();
        //最近一次提交报告时间
        Date solutionDate = complaintReport.getSolutionTime();
        Long solutionTime = 0L;
        if (null != solutionDate) {
            solutionTime = solutionDate.getTime();
        }
        //完成报告时间
        Date completeDate = complaintReport.getCompleteTime();
        //报告的状态
        Integer complaintReportStat = complaintReport.getReportStatus();


        //默认的时间计算方式包含:无人领取、领取后不提交解决方案
        //总用时=当前时间-第一次审核时间
        totalTime = nowTime - firstAuditTime;
        totalTime = totalTime / hourTime;

        //处理实际用时=当前时间-最近一次审核时间
        actualProcessingTime = nowTime - auditTime;
        actualProcessingTime = actualProcessingTime / hourTime;

        //剩余时间=有效时间-处理实际用时
        remainingTime = validTime - actualProcessingTime;

        //自行跟进:实际时间仍继续计时，但不计算超时，不返回给管理员
        if (complaintReportStat.equals(Constants.FOLLOW)) {
            remainingTime = 0.0;
        }

        //中断:实际时间停止计时，总用时停止计时
        if (complaintReportStat.equals(Constants.STOP)) {
            //处理实际用时=最近一次提交报告时间-最近一次审核时间
            actualProcessingTime = solutionTime - auditTime;
            actualProcessingTime = actualProcessingTime / hourTime;
            //总用时=最近一次提交报告时间-第一次审核时间
            totalTime = solutionTime - firstAuditTime;
            totalTime = totalTime / hourTime;
            remainingTime = 0.0;
        }

        //转派:实际时间停止计时，剩余时间停止计时
        if (complaintReportStat.equals(Constants.OTHER_FOLLOW)) {
            //处理实际用时=最近一次提交报告时间-最近一次审核时间
            actualProcessingTime = solutionTime - auditTime;
            actualProcessingTime = actualProcessingTime / hourTime;
            //剩余时间不计时
            remainingTime = 0.0;
        }

        //已完成:剩余时间和实际时间均停止计时
        if (complaintReportStat.equals(Constants.COMPLETE)) {
            //处理实际用时=最近一次提交报告时间-最近一次审核时间
            actualProcessingTime = solutionTime - auditTime;
            actualProcessingTime = actualProcessingTime / hourTime;
            //总用时=完成报告时间-第一次审核时间
            totalTime = completeDate.getTime() - firstAuditTime;
            totalTime = totalTime / hourTime;
            remainingTime = 0.0;
        }

        timeResponse.setTotalTime(getDecimalDouble(totalTime));
        timeResponse.setActualProcessingTime(getDecimalDouble(actualProcessingTime));
        timeResponse.setRemainingTime(getDecimalDouble(remainingTime) + "");
        //判断剩余时间是否小于0，如果小于0就加入‘超’字，以便前端判断是否展示
        if (remainingTime < 0.0) {
            timeResponse.setRemainingTime("超" + getDecimalDouble(abs(remainingTime)));
        }

        return timeResponse;
    }

    /**
     * 获取绝对值
     *
     * @param doubleValue 需要处理的值
     * @return 绝对化后的值
     */
    private static double abs(double doubleValue) {
        return doubleValue >= 0.0 ? doubleValue : -doubleValue;
    }

    /**
     * 将double数保留1位小数
     *
     * @param doubleValue 需要处理的值
     * @return 处理之后的值
     */
    private static String getDecimalDouble(double doubleValue) {
        DecimalFormat df = new DecimalFormat("0.0");
        return df.format(doubleValue);
    }


}
